package com.dc.project.util.reader;

import cn.hutool.http.HttpUtil;
import com.dc.project.util.reader.base.BaseReaderUtil;
import com.dc.project.util.reader.base.FileReaderModel;
import lombok.extern.slf4j.Slf4j;

import java.io.File;
import java.util.HashMap;
import java.util.Map;

/**
 * ReadUtil
 *
 * @author chenxueli
 * @date 2025-03-11 09:59:00
 */
@Slf4j
public class ReadUtil {

    private static final Map<String, BaseReaderUtil> READER_UTIL_MAP = new HashMap<>();

    static {
        put(new ExcelReaderUtil(), ".xls", ".xlsx");
        put(new WordReaderUtil(), ".doc", ".docx");
        put(new PdfReaderUtil(), ".pdf");
        put(new TxtReaderUtil(), ".txt", ".md");
        put(new ImageReaderUtil(), ".jpg", ".jpeg", ".png", ".webp");
    }

    /**
     * 将文件扩展名和对应的读取工具放入映射中
     *
     * @param util          读取工具
     * @param fileExtension 文件扩展名
     */
    private static void put(BaseReaderUtil util, String... fileExtension) {
        for (var extension : fileExtension) {
            READER_UTIL_MAP.put(extension.toLowerCase(), util);
        }
    }

    /**
     * 根据文件地址读取文件的内容信息
     *
     * @param url 文件URL
     * @return 文件内容
     */
    public static FileReaderModel read(String url) {
        // 获取待下载的文件后缀
        var fileExtension = url.substring(url.lastIndexOf(".")).toLowerCase();
        // 获取对应的工具
        var readerUtil = READER_UTIL_MAP.get(fileExtension);
        if (readerUtil == null) {
            throw new RuntimeException("不支持的文件格式：" + fileExtension);
        }
        // 如果使用可以URL直接读取，则直接读取
        if (readerUtil.canUseUrl()) {
            return readerUtil.read(url);
        }
        // 如果不能直接使用URL，则下载文件到本地
        File file = null;
        try {
            file = File.createTempFile(System.currentTimeMillis() + "", fileExtension);
            HttpUtil.downloadFile(url, file);
            return readerUtil.read(file);
        } catch (Exception e) {
            return FileReaderModel.EMPTY;
        } finally {
            if (file != null) {
                var flag = file.delete();
                log.info("删除文件：{}，结果：{}", file.getAbsolutePath(), flag);
            }
        }
    }

    /**
     * 读取文件内容
     *
     * @param file 文件
     * @return 文件内容
     */
    public static FileReaderModel read(File file) {
        // 获取待下载的文件后缀
        var path = file.getPath();
        var fileExtension = path.substring(path.lastIndexOf(".")).toLowerCase();
        // 根据文件扩展名选择不同的读取方式
        var readerUtil = READER_UTIL_MAP.get(fileExtension);
        if (readerUtil != null) {
            return readerUtil.read(file);
        } else {
            throw new RuntimeException("不支持的文件格式：" + fileExtension);
        }
    }

}
